package coreModel

import (
	"math"

	"github.com/spf13/cast"
)

// Pagination 分页信息
type Pagination struct {
	PageString     string      `json:"-"`         // 当前页码
	PageSizeString string      `json:"-"`         // 每页数量
	Page           int         `json:"page"`      // 当前页码
	PageSize       int         `json:"pageSize"`  // 每页数量
	TotalCount     int64       `json:"total"`     // 总记录数
	PageCount      int         `json:"pageCount"` // 总页数
	FirstPage      int         `json:"firstPage"` // 第一页页码
	LastPage       int         `json:"lastPage"`  // 最后一页页码
	PrevPage       int         `json:"prevPage"`  // 上一页页码
	NextPage       int         `json:"nextPage"`  // 下一页页码
	Rows           interface{} `json:"rows"`      // 数据列表
}

func (pagination *Pagination) Init() *Pagination {
	page := cast.ToInt(pagination.PageString)
	if page == 0 {
		page = 1
	}
	pageSize := cast.ToInt(pagination.PageSizeString)
	if pageSize == 0 {
		pageSize = 10
	}
	pagination.Page = page
	pagination.PageSize = pageSize
	return pagination
}

// GetOffset 获取偏移量
func (pagination *Pagination) GetOffset() int {
	if pagination.Page <= 1 {
		pagination.Page = 1
		return 0
	}
	return (pagination.Page - 1) * pagination.PageSize
}

// Paginate 对数据进行分页处理
func (pagination *Pagination) Paginate(data interface{}) {
	// 计算总页数
	pageCount := int(math.Ceil(float64(pagination.TotalCount) / float64(pagination.PageSize)))

	// 计算其他分页信息
	firstPage := 1
	lastPage := pageCount
	prevPage := pagination.Page - 1
	nextPage := pagination.Page + 1

	// 构建分页对象
	pagination.PageCount = pageCount
	pagination.FirstPage = firstPage
	pagination.LastPage = lastPage
	pagination.PrevPage = prevPage
	pagination.NextPage = nextPage
	pagination.Rows = data
}
